
/**
 * Classe di utilità contenente filtri da utilizzare per mostrare o meno alcuni
 * elementi di liste e/o elenchi
 * 
 * inObjectArray(list, arrayFilter, element) : filtra un array di oggetti ecludendo gli elementi non contenuti in un altro array, 
 * 
 * notInObjectArray(list, arrayFilter, element) : filtra un array di oggetti escludendo gli elementi già contenuti in un altro array, 
 *
 * dove : 
 *  - list è la lista che si deve filtrare(parametro settato da angular) 
 *  - arrayFilter è l'array utilizzato per filtrare(array contenente gli oggetti che si vogliono escludere (o includere))
 *  - element è il nome della proprietà dell'oggetto su cui filtrare (ad es 'id')
 * 
 * Esempio d'suo con ng-repeat : 
 * 
 * <div ng-repeat='letter in letters | inArray:filterBy:"id"'>{{letter.id}}</div>
 * 
 * dove : 
 * - inArray è la lista che si deve filtrare(parametro settato da angular) 
 * - filterBy (il primo parametro di questo filtro) è l'array utilizzato per filtrare(array contenente gli oggetti che si vogliono escludere(o includere))
 * - id (secondo parametro) è il nome della proprietà dell'oggetto su cui filtrare (ad es 'id')
 * 
 * 
 */

BootApplication
.filter('inObjectArray', function($filter){
    return function(list, arrayFilter, element){
        if(arrayFilter){
            return $filter("filter")(list, function(listItem){
            	for (var i = 0; i < arrayFilter.length; i++) {
	            	if (arrayFilter[i][element] == listItem[element]) {
	            		return true;
	            	}
            	}
            	return false;
            });
        }
    };
})
.filter('notInObjectArray', function($filter){
	return function(list, arrayFilter, element){
		 if(arrayFilter){
	            return $filter("filter")(list, function(listItem){
	            	for (var i = 0; i < arrayFilter.length; i++) {
		            	if (arrayFilter[i][element] == listItem[element]) {
		            		return false;
		            	}
	            	}
	            	return true;
	            });
	        }
    }
})
/**
 * Filtra la collection map con una proprietà specifica.
 * Il filtro è cas insensitive.
 * 
 * Usage: map collection | filterMapBy:'prop':prop_search
 * 
 * Esempio d'uso :
 * 
 *  ng-repeat="(codeFiltro, value) in elencoFiltri | filterValueMap:'name':search||''"
 *  
 */
.filter('filterMapBy', function() {
	return function(input, property, str) {
		var tmp = {};
		
		angular.forEach(input, function(val, key) {
    	
		   var comparator = val[property].toLowerCase();
    	
	       if (comparator.contains(str.toLowerCase())) tmp[key] = val;
		});
		
		return tmp;
	};
})
/**
 * Filtro che serve per trasformare un valore numerico che esprime secondi al suo corrispettivo
 * valore espresso nel formato hh:mm
 * 
 * Usage: valoreSecondi | secondsToHour
 * 
 */
.filter('secondsToHour', function() {
  return function(input) {
    
	  if(angular.isDefined(input) && input != null && input != ''){
		  var seconds = parseInt(input);
		  if(seconds == 'NaN')
			  return '';
		  var hours 	= Math.floor(seconds / 3600);
		  var minute 	= Math.round((seconds - (hours*3600))/60);
		  
		  var strHours 	= 	hours 	<= 9 ? '0'+hours 	: ''+hours;
		  var strMinute =	minute 	<= 9 ? '0'+minute 	: ''+minute;
		  
		  return strHours+":"+strMinute;
	  }else
		  return '';
  	};
})
/**
 * Filtro che serve per trasformare un valore numerico che esprime secondi al suo corrispettivo
 * valore espresso in minuti
 * 
 * Usage: valoreSecondi | secondsToHour
 * 
 */
.filter('secondsToMinutes', function() {
  return function(input) {
    
	  if(angular.isDefined(input) && input != null && input != ''){
		  var seconds = parseInt(input);
		  if(seconds == 'NaN')
			  return '';
		  var minute = Math.round(seconds / 60);
		  var strMinute = minute <= 9 ? '0'+ minute + " min" : ''+ minute + " min";
		  return strMinute;
	  }else
		  return '';
  	};
})
/**
 * Filtro che traduce i valori delle tipologie di linea.
 */
.filter('routeTypeTranslate', [ '$translate', function($translate) {
  return function(input) {
    
	  var ret = '';
	  if(angular.isDefined(input) && input != null && input != ''){
		  switch(input) {
		    case 'TRAM':
		        ret = $translate.instant('tpl.routeType.zero');
		        break;
		    case 'METROPOLITANA':
		        ret = $translate.instant('tpl.routeType.uno');
		        break;
		    case 'TRENO':
		    	ret = $translate.instant('tpl.routeType.due');
		        break;
		    case 'BUS':
		    	ret = $translate.instant('tpl.routeType.tre');
		        break;
		    case 'TRAGHETTO':
		    	ret = $translate.instant('tpl.routeType.quattro');
		        break;
		    case 'FUNIVIA':
		    	ret = $translate.instant('tpl.routeType.cinque');
		        break;
		    case 'GONDOLA':
		    	ret = $translate.instant('tpl.routeType.sei');
		        break;
		    case 'FUNICOLARE':
		    	ret = $translate.instant('tpl.routeType.sette');
		        break;
		  }
	  }
	  return ret;
  	};
}])